_monitor(barberM)
   op PrendreChaise() returns reponse:bool, SertClient(), CoupeCheveux(), OuvrePorte(), AllerChaiseBarbier(), CoupeFini(), QuitteShop()

_body(barberM)
   const NB_CHAISE_TOTAL := 5
   var nb_chaise_restante :int := NB_CHAISE_TOTAL
   var chaise_libre : bool := true
   _condvar(BARBIER_DORT)
   _condvar(CHAISE_BARBIER_LIBRE)
   _condvar(COUPE_FINI)
   _condvar(PORTE_OUVERTE)

   _proc( PrendreChaise() returns reponse)
      if nb_chaise_restante > 0 ->
         nb_chaise_restante--
         reponse := true
      [] else ->
         reponse := false
      fi
   _proc_end

   _proc( SertClient()) 
      _wait(BARBIER_DORT)
      nb_chaise_restante++
   _proc_end

   _proc( AllerChaiseBarbier()) 
      if not chaise_libre ->
         _wait(CHAISE_BARBIER_LIBRE)
      fi
      chaise_libre := false
      _signal(BARBIER_DORT)
   _proc_end

   _proc( CoupeCheveux()) 
      _wait(COUPE_FINI)
   _proc_end

   _proc( CoupeFini()) 
      _signal(COUPE_FINI)
   _proc_end

   _proc( OuvrePorte()) 
      do not _empty(PORTE_OUVERTE)
         nap(1)
      od
      _signal(PORTE_OUVERTE)
   _proc_end

   _proc( QuitteShop()) 
      _wait(PORTE_OUVERTE)
      chaise_libre := true
      _signal(CHAISE_BARBIER_LIBRE)
   _proc_end

_monitor_end
